package com.example.spingbootvue.controller;

import cn.hutool.core.io.FileUtil;
import com.example.spingbootvue.Common.AuthAccess;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

@RestController
@RequestMapping("/file")
public class FileController {

    // 将文件存储在 /www/wwwroot/uploads 目录，确保此目录具有写入权限
    public static final  String ROOT_PATH = System.getProperty("user.dir")+ File.separator + "files"; //文件下载根目录

    @AuthAccess
    @PostMapping("/upload")
    public String upload(MultipartFile file) throws IOException {
        String originalFilename = file.getOriginalFilename(); // 文件原始名称

        // 处理 originalFilename 为空的情况
        if (originalFilename == null || originalFilename.trim().isEmpty()) {
            originalFilename = "unknown_" + System.currentTimeMillis();
        }

        String mainName = FileUtil.mainName(originalFilename); // 文件前缀
        String extName = FileUtil.extName(originalFilename);

        // 检查 uploads 目录是否存在，不存在则创建
        File uploadDir = new File(ROOT_PATH);
        if (!uploadDir.exists()) {
            uploadDir.mkdirs();
        }

        // 若文件重名，则重命名
        File saveFile = new File(ROOT_PATH, originalFilename);
        if (saveFile.exists()) {
            originalFilename = System.currentTimeMillis() + "_" + mainName + "." + extName;
            saveFile = new File(ROOT_PATH, originalFilename);
        }

        // 保存文件
        file.transferTo(saveFile);

        // 对文件名进行 URL 编码，防止中文或特殊字符导致 URL 解析失败
        String encodedFilename = URLEncoder.encode(originalFilename, StandardCharsets.UTF_8.toString());

        // 返回文件访问 URL（前端可用此链接访问文件）
        return "http://localhost:8080/file/download/" + encodedFilename;
    }

    @AuthAccess
    @GetMapping("/download/{fileName}")
    public void download(@PathVariable String fileName, HttpServletResponse response) throws IOException {
        // 先对文件名进行 URL 解码，防止特殊字符问题
        String decodedFileName = URLDecoder.decode(fileName, StandardCharsets.UTF_8);
        String filePath = ROOT_PATH + File.separator + decodedFileName;

        // 检查文件是否存在
        if (!FileUtil.exist(filePath)) {
            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
            return;
        }

        // 设置下载文件的 HTTP 头
        response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(decodedFileName, StandardCharsets.UTF_8));

        // 读取文件并写入响应流
        byte[] bytes = FileUtil.readBytes(filePath);
        ServletOutputStream outputStream = response.getOutputStream();
        outputStream.write(bytes);
        outputStream.flush();
        outputStream.close();
    }
}
